﻿using System;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Administration;

namespace UpdateContentType
{
    public class Common
    {
        private string _url = default(string);
        private string _fileName = default(string);
        private byte[] _file = default(byte[]);

        /// <summary>
        /// Permite atualizar os tipos de conteúdo de um Web Application
        /// </summary>
        /// <param name="url">URL do Web Application que contém os tipos de conteúdo que serão atualizados</param>
        /// <param name="fileName">Nome do arquivo que será atualizado</param>
        /// <param name="file">Arquivo que será atualizado</param>
        public Common(string url, string fileName, byte[] file)
        {
            _url = url;
            _fileName = fileName;
            _file = file;
        }

        /// <summary>
        /// Atualiza todos os tipos de conteúdo que utilizam o arquivo informado no construtor da classe
        /// </summary>
        /// <returns>O número de site collections atualizados</returns>
        public int UpdateTemplate()
        {
            int count = 0;
            SPWebApplication app = SPWebApplication.Lookup(new Uri(_url));
            //Atualiza todos os site collections do web application
            for (int i = 0; i < app.Sites.Count; i++)
            {
                using (SPSite site = app.Sites[i])  //site collection
                {
                    using (SPWeb web = site.OpenWeb()) //site root
                    {
                        SPFolder ctsFolder = web.Folders["_cts"];  //content types folder

                        //varre as subpastas
                        foreach (SPFolder folder in ctsFolder.SubFolders)
                        {
                            //varre os arquivos da pasta até encontrar o que tenha o nome igual ao 
                            //do item que disparou o workflow
                            foreach (SPFile f in folder.Files)
                            {
                                if (f.Name == _fileName)
                                {
                                    //sobreescreve o arquivo e atualiza o content type e suas instâncias
                                    folder.Files.Add(_fileName, _file, true);
                                    web.ContentTypes[folder.Name].Update(true);
                                    count++;
                                    break;
                                }
                            }
                        }
                    }
                }
            }
            return count;
        }
    }
}
